控制反转(IOC)
控制反转(Inversion of Control),即依赖注入(Dependency Injection),它们两个是一个东西的两种不同的说法。依赖注入是一个程序设计模式和架构模型,是控制反转的特殊实现,它指一个对象应用另外一个对象来提供一个特殊的能力。IOC 是 Spring 的核心,理解它的时候可以分为控制和反转两步来理解。
举个例子:你现在接到一份工作,但是你没空,你把工作交给你的好友来完成,你对工作如何完成已不关心,控制权移交到你的好友手中,他可以决定如何完成工作,你只需要等待结果即可。
如上所述,控制即对工作的控制权,反转可理解为原先你所掌握的工作的控制权移交到好友身上。在 Spring 中理解为某一接口具体实现类的控制权从调用类中移除,转而由第三方控制(类似对成员变量的赋值的控制权从代码移交到 xml 配置文件中)。依赖注入理解为让调用者对某一接口实现类的依赖关系由第三方(容器或协助类)注入,以移除调用类对某一接口实现类的依赖。
面向切面编程(AOP)
面相切面编程(AOP)是对面相对象编程(OOP)的补充,OOP 主要的模块单元是 class (类),而 AOP 是 aspect(切面),切面使得诸如事务管理等跨越多个类型和对象的关注点模块化。AOP 通过横向抽取机制,为无法通过纵向继承体系进行抽象的类的重复性代码提供了解决方案。
连接点(Join point)
在程序执行过程中具有边界性质的特定点,比如某个类初始化前后、类的某个方法调用前后或者处理异常的时候。在 Spring AOP 中,一个连接点总是代表一个方法的执行。
增强(Advice)
在切面的某个特定的连接点上执行的动作。增强有各种类型,其中包括 around、before 和 after 等。Spring 以拦截器作增强模型,并维护一个以连接点为中心的拦截器链。
切点(Pointcut)
用来匹配连接点的断言。增强关联一个切点表达式,并在匹配这个切入点的连接点上运行。AOP 通过切点定位特定的连接点:Spring 默认使用切点语法 AspectJ。通过数据库查询的概念来理解切点和连接点:连接点相当于数据库中的记录,而切点相当于查询条件,一个切点可以匹配多个连接点。
切面(Aspect)
切面由切点和增强组成,包括横切逻辑和连接点的定义。在 Spring AOP 中,切面可以使用通用类(schema-based 基于模式的风格)或者在普通类中以 @Aspect 注解(@AspectJ 注解样式)来实现。
引介(Introduction)
引介是一种特殊的增强,它为类添加一些属性和方法。一个业务类原先没有实现某个接口,通过 AOP 的引介功能,可以动态地为该业务添加接口的实现逻辑,让业务类成为该接口的实现类。例如:使用一个引介来使 bean 实现 IsModified 接口,以便简化缓存机制。
目标对象(Target object)
被一个或多个切面所增强的对象。因为 Spring AOP 是使用运行时代理来实现的,所以这个对象总是一个代理对象。
代理(Proxy)
一个类被 AOP 织入增强后,就生成一个结果类,它是融合了原类和增强逻辑的代理类。根据不同的代理方式,代理类既可能是和原类具有相同接口的类,也可能是原类的子类,所以我们可以采用调用原类相同的方式调用代理类。在 Spring 中,AOP 代理可以是 JDK 动态代理或者 CGLIB 代理。
织入(Weaving)
织入是将增强添加到目标类具体连接点上的过程。AOP 有三种织入方式:
- 编译期织入,要求特殊的 Java 编译器
- 类装载期织入,要求使用特殊的类装载器
- 动态代理织入,在运行期为目标类添加增强生成子类的方式
Spring 采用动态代理织入(即在运行时完成织入),而 AspectJ 采用编译期和类装载期织入。
Spring 框架组件列表
GroupId | ArtifactId | 描述 |
---|---|---|
org.springframework | spring-aop | 支持基于代理的 AOP |
org.springframework | spring-aspects | 基于 AspectJ 的切面 |
org.springframework | spring-beans | 包含 Groovy 的 Beans 支持 |
org.springframework | spring-context | 应用程序上下文运行时,包括调度和远程抽象 |
org.springframework | spring-context-support | 支持将常见的第三方库集成到 Spring 应用程序上下文的类中 |
org.springframework | spring-core | Spring 核心,为其它模块所用 |
org.springframework | spring-expression | Spring 表达式(SpEL) |
org.springframework | spring-instrument | JVM 引导用的代理工具 |
org.springframework | spring-instrument-tomcat | Tomcat 的代理工具 |
org.springframework | spring-jdbc | JDBC 支持包,包括 DataSource 设置和 JDBC 访问支持 |
org.springframework | spring-jms | JMS 支持包,包括用于发送和接收 JMS 消息的帮助类 |
org.springframework | spring-messaging | 支持消息架构和协议 |
org.springframework | spring-orm | 对象/关系映射,包含对 JPA 和 Hibernate 支持 |
org.springframework | spring-oxm | 对象/XML映射 |
org.springframework | spring-test | 支持单元测试和集成测试的 Spring 组件 |
org.springframework | spring-tx | 事务基础设施,包括 DAO 支持和 JCA 集成 |
org.springframework | spring-web | Web 支持包,包括客户端和 Web 远程处理 |
org.springframework | spring-webmvc | REST Web 服务和 Web 应用程序实现的 model-view-controller |
org.springframework | spring-webmvc-portlet | MVC 实现在 Portlet 环境中的使用 |
org.springframework | spring-websocket | WebSocket 和 SockJS 实现,包含 STOMP 支持 |